package com.ruoyi.common.gen.service.impl;

import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.gen.entity.${entity};
import com.ruoyi.common.gen.mapper.${table.mapperName};
import com.ruoyi.common.gen.service.${table.serviceName};
import com.ruoyi.common.utils.poi.ExcelUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 描述：${table.comment} 服务实现类
 * @author ${author}
 * @since ${date}
 */
@Service
@Slf4j
public class ${table.serviceImplName} extends ${superServiceImplClass}<${table.mapperName}, ${entity}> implements ${table.serviceName} {

    /**
     * 描述：分页查询
     * @author ${author}
     * @date ${date}
     */
    @Override
    public IPage<${entity}> pageList(${entity} ${table.entityPath}) {
        int current = ${table.entityPath}.getCurrent();
        int size = ${table.entityPath}.getSize();
        Page<${entity}> pageVo = lambdaQuery().page(new Page<>(current, size));
        handlePageList(pageVo);
        return pageVo;
    }
    
     /**
      * 描述：详情
     * @author ${author}
     * @date ${date}
      */
     @Override
     public ${entity} detail${entity}(Long id) {
         ${entity} ${table.entityPath} = getById(id);
         handleDetail${entity}(${table.entityPath});
         return ${table.entityPath};
     }   

    /**
     * 描述：保存
     * @author ${author}
     * @date ${date}
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void save${entity}(${entity} ${table.entityPath}) {
        try {
            // 1. 参数校验
            checkSave${entity}(${table.entityPath});
            // 2. 处理参数
            handleSave${entity}(${table.entityPath});
            // 3. 保存
            save(${table.entityPath});
            // 4. 若保存牵涉其他表, 则处理
            saveOther(${table.entityPath});
        } catch (Exception e) {
            log.error("保存失败！", e);
            throw new RuntimeException("保存失败！");
        }
    }

    /**
     * 描述：修改
     * @author ${author}
     * @date ${date}
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void update${entity}(${entity} ${table.entityPath}) {
        try {
            // 1. 参数校验
            checkUpdate${entity}(${table.entityPath});
            // 2. 处理参数
            handleUpdate${entity}(${table.entityPath});
            // 3. 修改
            saveOrUpdate(${table.entityPath});
            // 4. 若保存牵涉其他表, 则处理
            updateOther(${table.entityPath});
        } catch (Exception e) {
            log.error("修改失败！", e);
            throw new RuntimeException("修改失败！");
        }
    }

    /**
     * 描述：删除
     * @author ${author}
     * @date ${date}
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void delete${entity}(List<Long> ids) {
        if (CollectionUtil.isNotEmpty(ids)) {
            try {
                deleteOther(ids);
                removeBatchByIds(ids);
            } catch (Exception e) {
                log.error("删除失败！", e);
                throw new RuntimeException("删除失败！");
            }
        }
    }

    /**
     * 描述：导出
     * @author ${author}
     * @date ${date}
     */
    @Override
    public void exportExcel(HttpServletResponse response, ${entity} ${table.entityPath}) {
        ExcelUtil<${entity}> util = new ExcelUtil<>(${entity}.class);
        IPage<${entity}> pageVo = pageList(${table.entityPath});
        if (pageVo == null) {
            throw new RuntimeException("导出失败！");
        }
        util.exportExcel(response, pageVo.getRecords(), "数据列表");
    }

    /**
     * 描述：查询结果进行封装
     * @author ${author}
     * @date ${date}
     */
    private void handlePageList(Page<${entity}> pageVo) {
        // 如果有查询结果需要进行封装, 请在这个写逻辑, 并去掉注释.
    }
    
    /**
     * 描述：对详情结果进行封装
     * @author cymal
     * @date 2024-03-24
     */
    private void handleDetail${entity}(${entity} ${table.entityPath}) {
        // 如果有查询结果需要进行封装, 请在这个写逻辑, 并去掉注释.
    }    

    /**
     * 描述：保存前置校验
     * @author ${author}
     * @date ${date}
     */
    private void checkSave${entity}(${entity} ${table.entityPath}) {
        // 如果有参数校验, 请在这个写逻辑, 并去掉注释.
    }

    /**
     * 描述：保存前置参数处理
     * @author ${author}
     * @date ${date}
     */
    private void handleSave${entity}(${entity} ${table.entityPath}) {
        // 如果有参数需要二次处理, 请在这个写逻辑, 并去掉注释.
    }

    /**
     * 描述：保存后处理其他表
     * @author ${author}
     * @date ${date}
     */
    private void saveOther(${entity} ${table.entityPath}) {
        // 如果有对其他表的操作, 请在这个写逻辑, 并去掉注释.
    }

    /**
     * 描述：修改前置校验
     * @author ${author}
     * @date ${date}
     */
    private void checkUpdate${entity}(${entity} ${table.entityPath}) {
        // 如果有参数校验, 请在这个写逻辑, 并去掉注释.
    }

    /**
     * 描述：修改前置参数处理
     * @author ${author}
     * @date ${date}
     */
    private void handleUpdate${entity}(${entity} ${table.entityPath}) {
        // 如果有参数需要二次处理, 请在这个写逻辑, 并去掉注释.
    }

    /**
     * 描述：修改后处理其他表
     * @author ${author}
     * @date ${date}
     */
    private void updateOther(${entity} ${table.entityPath}) {
        // 如果有对其他表的操作, 请在这个写逻辑, 并去掉注释.
    }

    /**
     * 描述：修改后处理其他表
     * @author ${author}
     * @date ${date}
     */
    private void deleteOther(List<Long> ids) {
        // 如果有对其他表的操作, 请在这个写逻辑, 并去掉注释.
    }

}